In the latter half of the twentieth century, there began a phenomenon known as the information revolution. While the information revolution is a historical development broader in scope than any one event or machine, no single device has come to represent the information revolution more than the digital electronic computer. The development of computer systems has surely been a revolution. Each year, computer systems grow faster, store more data, and provide more applications to their users.
A modern computer system is an enormously complex machine, usually having many sub-parts or subsystems, each of which may be concurrently performing different functions in a cooperative, although partially autonomous, manner. Typically, the system comprises one or more central processing units (CPUs) which form the heart of the system, and which execute instructions contained in computer programs. Instructions and other data required by the programs executed by the CPUs are stored in memory, which often contains many heterogenous components and is hierarchical in design, containing a base memory or main memory and various caches at one or more levels. At another level, data is also stored in mass storage devices such as rotating disk drives, tape drives, and the like, from which it may be retrieved and loaded into memory. The system also includes hardware necessary to communicate with the outside world, such as input/output controllers; I/O devices attached thereto such as keyboards, monitors, printers, and so forth; and external communication devices for communicating with other digital systems.
Each component of a digital computer system is itself a very complex instrument, having a design hierarchy which can mimic that of the system. For example, a disk drive storage device typically contains one or more spinning disks on which data is recorded, an actuator and transducers for accessing data on the disk, a central controller which executes a control program for controlling the operation of the device, motors for driving the spinning disk and the mechanical actuator, various drivers for the motor, actuator and transducer, sense amplification electronics for reading the transducer, internal communications interfaces among the various components, and an external communications interface for communicating data with the outside world. Within any such component, further design hierarchies may exist.
Although a general-purpose computer can be programmed to perform a variety of different tasks, the range of applications and environments in which computer systems and other digital devices will be used creates a demand for devices of differing sizes and configurations. Some computer systems are used primarily as servers, in which multiple users (who may be geographically isolated, using a heterogeneous mixture of computer systems and application software) access a centralized set of applications and common database. Other computer systems are used primarily as single-user devices, in which a single user performs a set of applications of interest to the user, locally stores data of interest to the user, and may optionally communicate with other computers as required to access external data. Still other computer systems may perform specialized functions, such as monitoring and controlling physical sensors, switches, motors, valves, and other controls. A special-purpose digital device may or may not even be considered a computer system, but contains many of the design attributes of a general-purpose computer system.
Many digital system components are implemented on integrated circuit chips. Improvements in the manufacture and design of integrated circuitry have made it possible to place a very large number of active devices, such as transistors, on a single integrated circuit chip. This in turn makes it possible for a single chip to perform complex functions of a digital device. For some years now, it has been possible to implement a complete CPU on a single integrated circuit chip. In recent years, further increases in the number of circuits on a chip have enabled further improvements to the CPU. For example, additional chip capability has been used to increase the number and sizes of on-chip caches, to increase the number of registers, to provide floating point and other numerically intensive hardware processing, etc. In some cases, it has even been possible to implement multiple CPUs on a single integrated circuit chip.
A CPU for a general-purpose computer system has a great range of capability, and can be programmed to perform almost any arbitrary function with respect to data it manipulates. I.e., it can be programmed to produce almost any desired defined data output for a given input. Unfortunately, this capability comes at a cost. The CPU will typically load instructions from an external source, decode the instructions and follow a logical path through the instructions, perform data manipulations as directed, use results of data manipulations to determine future instruction paths, etc. All of these operations take time. Additionally, because the CPU is doing so many things at a time, it typically consumes a relatively large amount of power.
For many functions performed by components of a general-purpose digital computer system or a special-purpose digital device, it is not necessary to have all the capabilities of a typical CPU. These functions can be performed by smaller, special-purpose digital logic circuits which perform only a limited set of functions. Such smaller, special-purpose digital logic circuits often consume less power than a typical CPU, and because they perform a more limited set of functions, often do so faster than a typical CPU. An integrated circuit chip which is designed to perform such specialized functions is often referred to as an “application specific integrated circuit” (ASIC).
Like a general-purpose CPU, an ASIC is a digital logic circuit which will produce a defined output in response to a given input. It uses the same type of logic gates and subcomponents found in a CPU, and is therefore not qualitatively different. It is simply more limited in the variety of functions it can perform. Many ASICs are programmable to alter their functions within some design range, but in general they do not have the flexibility of a general-purpose CPU. Within a general-purpose digital computer system, ASICs are often used as memory device controllers, I/O device controllers, bus controllers, adapters and repeaters, and so forth. In a special-purpose digital device, ASICs may perform additional functions.
One of the challenge of using ASICs is the design effort involved. The design of a single general-purpose CPU is a substantial effort, but once the CPU is designed, it can be programmed to perform almost any arbitrary data function. Where ASICs are used to perform a variety of different functions in different applications, a separate ASIC design exists for each application. Although the design of a single ASIC is no more difficult (and often less so) than that of a general-purpose processor, the number of different applications and consequent number of separate ASIC designs can involve a substantial burden in the design and development of a digital system using ASICs.
In order to reduce the difficulty of designing multiple ASICs performing different functions, ASICs are often designed with re-usable internal sub-components. Typically, much of the logic within an ASIC will duplicate functions which have previously existed in other ASICs, although there will be at least some new function. Using an existing library of internal sub-component designs, a new ASIC design can be created by borrowing the existing designs of common subcomponents and creating only a limited amount of new logic, without having to generate all of the internal logic from scratch.
One recurring type of logic circuitry useful in ASIC design is an internal communications mechanism for transferring data among multiple functional components of an ASIC. It is possible to design special logic circuitry for each desired internal data path within an ASIC, taking into account the characteristics of the sender and receiver, as well as the data being transferred, to optimize the internal data path. However, such special circuitry is likely to be different for each permutation of sender and receiver component module, depending on the requirements of the individual components. Thus, the design of special logic circuitry for communicating among multiple component modules can add significantly to the design effort for the ASIC. On the other hand, it is possible to design a generic interface for communication among different functional components, but generic interfaces are likely to involve greater overhead and be less than optimal.
Different functional components within an ASIC may produce or handle data using different data alignment. This problem occurs particularly in the case of ASICs which perform a bridging function between two or more parallel data buses, because each bus has its own protocol and alignment requirements. In such an ASIC, a functional component interfacing with a first bus transfers data to and from a functional component interfacing with a second bus, where the buses may employ different data alignments (may be in different data alignment domains). Conventionally, a special-purpose alignment mechanism is defined, either in the first or second component, for converting from one alignment domain to the other. As the number of different buses attached to a single ASIC increases, the need for designing and implementing such special purpose alignment mechanisms grows in difficulty, because a separate alignment mechanism may be required for each pair of functional components in communications with each other. Alternatively, a common internal interface for communication among the different functional components may be defined, having a defined alignment domain of its own. In this case, each functional component will align data, as necessary, to the alignment domain of the common interface. This approach may result in unnecessary alignment conversion operations. For example, some pairs of functional components may use the same alignment, but one which is different from that of the common interface. In this case, data being transferred is unnecessarily converted from the first alignment to the common interface alignment, and back again to the second alignment (which is the same as the first).
It would be desirable to provide a generic architectural design for supporting communications among different functional components of an integrated circuit chip, particularly an ASIC chip, which reduces the overhead of transferring and aligning data. In particular, it would be desirable to provide a generic architectural mechanism which reduces the amount of alignment hardware and/or alignment operations performed and is easily incorporated for a variety of ASIC designs employing different functional components in different alignment domains.